package com.java.queue;

import java.util.Scanner;

import static java.lang.System.exit;

/**
 * 使用数组模拟一个队列
 *
 * @author 19252
 */
public class ArrayQueue {
    /**
     * 队列的大小
     */
    private int maxSize;

    /**
     * 指向队列的头部指针
     */
    private int head = -1;

    /**
     * 指向队列的尾部指针
     */
    private int tail = -1;

    /**
     * 数组队列
     */
    private int[] queue;

    public int getMaxSize() {
        return maxSize;
    }

    public void setMaxSize(int maxSize) {
        this.maxSize = maxSize;
    }

    public int getHead() {
        return head;
    }

    public void setHead(int head) {
        this.head = head;
    }

    public int getTail() {
        return tail;
    }

    public void setTail(int tail) {
        this.tail = tail;
    }

    public int[] getQueue() {
        return queue;
    }

    public void setQueue(int[] queue) {
        this.queue = queue;
    }

    public static void main(String[] args) {
        // 定义一个输入流，获取输入的数字
        System.out.println("请输入队列的大小（数字）");
        Scanner scanner = new Scanner(System.in);
        ArrayQueue queue = new ArrayQueue();
        queue.setMaxSize(scanner.nextInt());
        queue.creatQueue(queue.getMaxSize());
        boolean loop = true;
        while (loop) {
            System.out.println("s: 展示队列");
            System.out.println("g: 获取头部");
            System.out.println("a: 添加数据");
            System.out.println("e: 退出操作");
            String c = scanner.next();
            switch (c) {
                case "s":
                    queue.showQueue();
                    break;
                case "g":
                    queue.getData();
                    break;
                case "a":
                    System.out.println("请输入一个数字！");
                    queue.addData(scanner.nextInt());
                    break;
                case "e":
                    loop = false;
                    break;
                default:
                    exit(0);
                    loop = false;
                    break;
            }
        }
    }

    /**
     * 创建一个队列
     *
     * @param maxSize 队列的最大长度
     */
    public void creatQueue(int maxSize) {
        setQueue(new int[maxSize]);
    }

    /**
     * 队列判满
     * 当tail指针指向队列最后一位，则满
     */
    public boolean isFull() {
        if (getTail() == getMaxSize() - 1) {
            System.out.println("队列已满，不能再添加数据！");
            return true;
        }
        return false;
    }

    /**
     * 队列判空
     * tail指针还指向队列头部 （-1）
     * tail == head == （maxSize - 1） 同样为空
     * 空则true
     * 不空false
     */
    public boolean isEmpty() {
        if (getTail() == -1) {
            System.out.println("队列为空");
            return true;

        }
        if (getTail() == getMaxSize() - 1) {
            if (getTail() == getHead()) {
                System.out.println("队列数据已被全部取出，为空！");
                return true;
            }
        }
        return false;
    }

    /**
     * 展示队列
     * 如果不为空队列才展示
     */
    public void showQueue() {
        if (this.isEmpty()) {
            int font = 0;
            if (getHead() != -1) {
                font = getHead();
            }
            for (int i = font; i < getMaxSize(); i++) {
                System.out.println("queue[%d]: " + getQueue()[i]);
            }
        }
    }

    /**
     * 为队列添加一个数据
     * tail 指针向后移一位
     *
     * @param data 数据
     */
    public void addData(int data) {
        if (!this.isFull()) {
            int tail = getTail() + 1;
            int[] queue = getQueue();
            queue[tail] = data;
            setQueue(queue);
            setTail(tail);
        }
    }

    /**
     * 队列不为空则取出它的第一个数据
     */
    public void getData() {
        if (isEmpty()) {
            if (getTail() > getHead()){
                int head = getHead() + 1;
                System.out.println(" queue:" + getQueue()[head]);
                setHead(head);
            }
        }
    }
}
